001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Nov 27, 2002 005 * Time: 5:00:08 PM 006 */ 007 008 package EVolve.visualization.XYViz.ValRefViz.HotSpotViz; 009 010 import EVolve.visualization.XYViz.ValRefViz.ValueReferenceVisualization; 011 import EVolve.visualization.*; 012 import EVolve.Scene; 013 import EVolve.util.painters.*; 014 import EVolve.util.phasedetectors.*; 015 import EVolve.data.Element; 016 import javax.swing.*; 017 import java.util.*; 018 import java.awt.*; 019 import java.awt.event.*; 020 021 public class HotSpotVisualization extends ValueReferenceVisualization { 022 protected JTextField textInterval; // input for interval 023 protected JComboBox comboPainter; 024 protected Painter painters[]; 025 protected int selectedPainter; 026 protected JPanel configurationPanel; 027 private JMenuItem itemSelectTimeFrame, itemSelectOccurredEntities, itemSelectAllEntities; 028 protected static JMenuItem selectionMenu[] = null; 029 protected static int SELECT_OPTION = 0x0011; 030 031 032 public HotSpotVisualization() { 033 interval = 1000; 034 painters = new Painter[2]; 035 painters[0] = new DefaultPainter(); 036 painters[1] = new RandomPainter(); 037 selectedPainter = 0; 038 phaseDetector = new HotspotPhaseDetector(); 039 } 040 041 protected JPanel createConfigurationPanel() { 042 JPanel panelBottom = new JPanel(new GridLayout(2,2)); 043 panelBottom.add(new JLabel("Interval: ")); 044 045 textInterval = new JTextField(String.valueOf(interval), 10); 046 panelBottom.add(textInterval); 047 048 comboPainter = new JComboBox(); 049 for (int i = 0; i < painters.length; i++) { 050 comboPainter.addItem(painters[i].getName()); 051 } 052 comboPainter.addActionListener(new ActionListener() { 053 public void actionPerformed(ActionEvent e) { 054 selectedPainter = comboPainter.getSelectedIndex(); 055 } 056 }); 057 panelBottom.add(new JLabel("Painter used: ")); 058 panelBottom.add(comboPainter); 059 060 061 if (configurationPanel == null) 062 configurationPanel = new JPanel(new FlowLayout()); 063 configurationPanel.add(panelBottom); 064 065 return configurationPanel; 066 } 067 068 public void preVisualize() { 069 xMax = 0; 070 imageMap.clear(); 071 currentThread = -1; 072 image = new AutoImage(); 073 xOffset = -1; 074 installPainter(); 075 timeMap.clear(); 076 phaseDetector.reset(); 077 } 078 079 public void receiveElement(Element element) { 080 if (element.isOptional()) return; 081 082 long x = xAxis.getField(element); 083 long y = yAxis.getField(element); 084 long z = 0; 085 086 phaseDetector.collectData(x/interval,y); 087 if (selectedPainter != 0) // using random painter 088 paint(x,y,y); 089 else 090 paint(x,y,z); 091 } 092 093 public void visualize() { 094 sort(); 095 } 096 097 public void makeSelection() { 098 if (SELECT_OPTION == 0) { 099 Scene.showErrorMessage("No data is to be selected."); 100 return; 101 } 102 103 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) { 104 Scene.showErrorMessage("The active data source used currently is different from \n" + 105 "this visualization, please choose \"" + 106 Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\"."); 107 return; 108 } 109 110 int x1 = canvas.getStartX(); 111 int x2 = canvas.getEndX(); 112 int y1 = canvas.getEndY(); 113 int y2 = canvas.getStartY(); 114 115 if (!normalOrientation) { 116 int temp; 117 temp = x1; 118 x1 = y1; 119 y1 = temp; 120 temp = x2; 121 x2 = y2; 122 y2 = temp; 123 } 124 125 if (((x1<0)&&(x2<0)) || ((x1>=timeMap.size()))&&(x2>=timeMap.size()) || 126 ((y1<0)&&(y2<0)) || ((y1>=yAxis.getEntityNumber())&&(y2>=yAxis.getEntityNumber()))) 127 return; 128 129 /*if (x1==x2) { 130 x2++; 131 }*/ 132 133 if (x1 < 0) { 134 x1 = 0; 135 } 136 137 if (x1 > (timeMap.size() - 1)) { 138 x1 = timeMap.size() - 1; 139 } 140 141 if (x2 > (timeMap.size() - 1)) { 142 x2 = timeMap.size() - 1; 143 } 144 145 if (y1 < 0) { 146 y1 = 0; 147 } 148 149 if (y1 > (yAxis.getEntityNumber() - 1)) { 150 y1 = yAxis.getEntityNumber() - 1; 151 } 152 153 if (y2 > (yAxis.getEntityNumber() - 1)) { 154 y2 = yAxis.getEntityNumber() - 1; 155 } 156 157 long start = ((long[])timeMap.get(x1))[1]; 158 long end = ((long[])timeMap.get(x2))[1]; 159 160 if (((SELECT_OPTION & 0x000f) != SELECT_TIME_FRAME)||((x2==x1)&&(x1==0))) { // do not select time frame 161 start = 0; 162 end = Long.MAX_VALUE; 163 } else { 164 /*if (x2==x1) { 165 x1--; 166 } 167 start = ((long[])timeMap.get(x1))[1];*/ 168 if (x1==x2) { 169 if (x2+1<timeMap.size()) { 170 end = ((long[])timeMap.get(x2+1))[1]; 171 } else 172 end = Long.MAX_VALUE; 173 } 174 } 175 176 int[] selection = null; 177 switch (SELECT_OPTION & 0x0ff0) { 178 case 0x0100: // select all entities in the draw box 179 selection = new int[y2 - y1 + 1]; 180 for (int i = y1; i <= y2; i++) { 181 selection[i - y1] = i; 182 } 183 break; 184 case 0x0010: // select occurred entities 185 ArrayList idList = new ArrayList(); 186 for (int i=y1; i<=y2; i++) { 187 for (int j=x1; j<=x2; j++) { 188 Color color; 189 if (normalOrientation) 190 color = image.getSortedColor(null,yAxis,j,i); 191 else 192 color = image.getSortedColor(yAxis,null,i,j); 193 if (color != null) { 194 idList.add(new Integer(i)); 195 break; 196 } 197 } 198 } 199 200 selection = new int[idList.size()]; 201 for (int i=0; i<idList.size(); i++) { 202 selection[i] = ((Integer)idList.get(i)).intValue(); 203 } 204 break; 205 case 0x0000: // no selection on entities 206 y1 = 0; 207 y2 = yAxis.getEntityNumber() - 1; 208 selection = new int[y2 - y1 + 1]; 209 for (int i = y1; i <= y2; i++) { 210 selection[i - y1] = i; 211 } 212 break; 213 } 214 215 yAxis.makeSelection(subjectDefinition.getType(),selection,start,end,timeMap); 216 } 217 218 public void paint(long x, long y, long z) { 219 long temp = x; 220 if (x > xMax) { 221 xMax = x; 222 } 223 224 if (xOffset == -1) xOffset = x/interval; 225 226 x = x/interval; 227 228 painter.paint(image,x-xOffset,y,z); 229 230 countEvents(temp); 231 } 232 233 protected void updateConfiguration() { 234 try { 235 if (autoInterval == -1) 236 interval = Integer.parseInt(textInterval.getText()); 237 else { 238 interval = autoInterval; 239 autoInterval = -1; 240 textInterval.setText(String.valueOf(interval)); 241 } 242 super.updateConfiguration(); 243 244 } catch (Exception e) { 245 Scene.showErrorMessage("Interval must be an integer"); 246 configure(); 247 } 248 } 249 250 public JMenuItem[] createSelectionMenuItem() { 251 if (selectionMenu != null) return selectionMenu; 252 253 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame"); 254 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T); 255 itemSelectTimeFrame.addActionListener(new ActionListener() { 256 public void actionPerformed(ActionEvent e) { 257 boolean selected = itemSelectTimeFrame.isSelected(); 258 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME); 259 } 260 }); 261 itemSelectTimeFrame.setSelected(true); 262 263 itemSelectOccurredEntities = new JCheckBoxMenuItem("Occurred Entities"); 264 itemSelectOccurredEntities.setMnemonic(KeyEvent.VK_O); 265 itemSelectOccurredEntities.addActionListener(new ActionListener() { 266 public void actionPerformed(ActionEvent e) { 267 boolean selected = itemSelectOccurredEntities.isSelected(); 268 SELECT_OPTION = switchOption(selected,SELECT_OPTION, SELECT_OCCURRED_ENTITIES); 269 270 /*if (itemSelectAllEntities.isSelected() && selected) { 271 SELECT_OPTION = switchOption(false,SELECT_OPTION, SELECT_ALL_ENTITIES); 272 itemSelectAllEntities.setSelected(false); 273 }*/ 274 } 275 }); 276 itemSelectOccurredEntities.setSelected(true); 277 278 itemSelectAllEntities = new JCheckBoxMenuItem("All Entities"); 279 itemSelectAllEntities.setMnemonic(KeyEvent.VK_A); 280 itemSelectAllEntities.addActionListener(new ActionListener() { 281 public void actionPerformed(ActionEvent e) { 282 boolean selected = itemSelectAllEntities.isSelected(); 283 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_ALL_ENTITIES); 284 285 if (itemSelectOccurredEntities.isSelected() && selected) { 286 SELECT_OPTION = switchOption(false,SELECT_OPTION, SELECT_OCCURRED_ENTITIES); 287 itemSelectOccurredEntities.setSelected(false); 288 } 289 } 290 }); 291 itemSelectAllEntities.setSelected(true); 292 293 selectionMenu = new JMenuItem[2]; 294 selectionMenu[0] = itemSelectTimeFrame; 295 selectionMenu[1] = itemSelectOccurredEntities; 296 //selectionMenu[2] = itemSelectAllEntities; 297 298 return selectionMenu; 299 } 300 301 protected void installPainter() { 302 painter = painters[selectedPainter]; 303 } 304 305 public Object clone() { 306 HotSpotVisualization o = (HotSpotVisualization) super.clone(); 307 o.configurationPanel = null; 308 o.panelConfiguration = o.createConfigurationPanel(); 309 o.createDialog(); 310 return o; 311 } 312 }